package com.carbon.core.util;

import com.carbon.core.lang.Assert;
import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;

/**
 * 人民币工具类
 *
 * @author czq
 * @date 2021-03-08
 */
public class RmbUtils {

    private static final String[] NUM = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
    private static final String[] INTEGER_UNIT = {"拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰"};
    private static final String[] DECIMAL_UNIT = {"角", "分"};


    /**
     * 数字转 RMB 大写 (保存两位小数, 默认四舍五入模式)
     *
     * @param value 值
     * @return 返回 RMB 字符串
     */
    public static String numToRMBChars(Integer value) {
        return numToRMBChars(value.toString(), BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 数字转 RMB 大写 (保存两位小数, 默认四舍五入模式)
     *
     * @param value        值
     * @param roundingMode 保留小数方式
     * @return 返回 RMB 字符串
     * @see BigDecimal
     */
    public static String numToRMBChars(Integer value, Integer roundingMode) {
        return numToRMBChars(value.toString(), roundingMode);
    }

    /**
     * 数字转 RMB 大写 (保存两位小数, 默认四舍五入模式)
     *
     * @param value 值
     * @return 返回 RMB 字符串
     */
    public static String numToRMBChars(Double value) {
        return numToRMBChars(value.toString(), BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 数字转 RMB 大写 (保存两位小数, 默认四舍五入模式)
     *
     * @param value        值
     * @param roundingMode 保留小数方式
     * @return 返回 RMB 字符串
     * @see BigDecimal
     */
    public static String numToRMBChars(Double value, Integer roundingMode) {
        return numToRMBChars(value.toString(), roundingMode);
    }

    /**
     * 数字转 RMB 大写 (保存两位小数, 默认四舍五入模式)
     *
     * @param value 值
     * @return 返回 RMB 字符串
     */
    public static String numToRMBChars(BigDecimal value) {
        Assert.isNotNull(value);
        value = value.setScale(2, BigDecimal.ROUND_HALF_UP);
        return numToRMBChars(value.toString());
    }

    /**
     * 数字转 RMB 大写 (保存两位小数, 默认四舍五入模式)
     *
     * @param value        值
     * @param roundingMode 保留小数方式
     * @return 返回 RMB 字符串
     * @see BigDecimal
     */
    public static String numToRMBChars(BigDecimal value, Integer roundingMode) {
        Assert.isNotNull(value);
        value = value.setScale(2, roundingMode);
        return numToRMBChars(value.toString());
    }

    /**
     * 数字转 RMB 大写 (保存两位小数, 默认四舍五入模式)
     *
     * @param value        值
     * @param roundingMode 保留小数方式
     * @return 返回 RMB 字符串
     * @see BigDecimal
     */
    private static String numToRMBChars(String value, Integer roundingMode) {
        Assert.isNotNull(value);
        BigDecimal bigDecimal = new BigDecimal(value);
        bigDecimal = bigDecimal.setScale(2, null == roundingMode ? BigDecimal.ROUND_HALF_UP : roundingMode);
        return numToRMBChars(value.toString());
    }


    /**
     * 数字转 RMB 大写
     *
     * @param value 值
     * @return 返回 RMB 字符串
     */
    public static String numToRMBChars(String value) {
        Assert.isNumber(value);

        String[] split = value.split("\\.");
        String integer = split[0];
        StringBuilder result = new StringBuilder();
        boolean nonZero = false;
        for (int i = 0; i < integer.length(); i++) {
            int num = integer.charAt(i) - '0';
            if (i != integer.length() - 1 && num != 0) {
                result.append(NUM[num]).append(INTEGER_UNIT[integer.length() - 2 - i]);
                nonZero = false;
            } else if (i != integer.length() - 1 && num == 0 && (i > 0 && integer.charAt(i - 1) - '0' != 0)) {
                result.append(NUM[num]);
                nonZero = true;
            } else if (i == integer.length() - 1 && num != 0) {
                result.append(NUM[num]);
                nonZero = false;
            }
        }
        if (nonZero) {
            result.deleteCharAt(result.length() - 1);
        }
        String fraction = "";
        if (split.length > 1) {
            fraction = split[1];
        }

        StringBuilder sb = new StringBuilder();
        if (!StringUtils.isEmpty(fraction)) {
            int length = fraction.length();
            if (length == 1) {
                sb.append(fraction).append(DECIMAL_UNIT[length - 1]);
            } else if (length >= DECIMAL_UNIT.length) {
                for (int i = 0; i < DECIMAL_UNIT.length; i++) {
                    int num = fraction.charAt(i) - '0';
                    if (num != 0) {
                        sb.append(NUM[num]).append(DECIMAL_UNIT[i]);
                    }
                }
            }
        }
        return result.toString() + "元" + sb.toString();
    }


}
